"""
声明与操作Mysql数据库相关的工具类和方法
"""

import pymysql


class MySQLUtils():
    """
    操作MySQL数据库的工具类
    """

    @staticmethod
    def getConnection():
        """
        获取MySQL数据库的连接对象

        @return: MySQL数据库的连接对象
        """
        conn = None
        try:
            # 获取MySQL数据库连接对象
            conn = pymysql.connect(
                host='localhost',
                port=3306,
                user='root',
                password='285013',
                database='meiduo',
                charset='utf8'
            )
        except Exception as e:
            print('获取MySQL数据库连接对象失败')
            print(e)
        # 返回数据库的连接对象
        return conn

    @staticmethod
    def update(sql, params=None):
        """
        更新MySQL数据库中数据的通用方法，包括对数据库中数据的增删改

        @param - sql: 需要执行的sql语句
        @param - params: 向sql语句中填充的参数，元组类型，默认值为None

        @return: 返回本次操作对数据库中数据的影响行数
        """
        conn = MySQLUtils.getConnection()  # 获取MySQL的连接对象
        cur = None
        row_count = None
        try:
            cur = conn.cursor()  # 获取执行sql的游标对象
            if params is None:
                row_count = cur.execute(sql)
            else:
                row_count = cur.execute(sql, params)
            conn.commit()  # 提交本次操作
        except Exception as e:
            conn.rollback()  # 如果执行SQL语句时出现异常则回滚本次操作
            print('执行SQL语句时出现异常')
            print(e)
        finally:
            MySQLUtils.closeResource(conn=conn, cur=cur)  # 关闭连接数据库的资源
        return row_count

    @staticmethod
    def select(sql, params=None):
        """
        查询MySQL数据库中数据的通用方法

        @param - sql: 需要执行的sql语句
        @param - params: 向sql语句中填充的参数，元组类型，默认值为None

        @return: 返回的为字典类型数据，字典中row_count为本次查询结果的行数，data为本次查询结果集(元组类型)
        """
        conn = MySQLUtils.getConnection()  # 获取MySQL数据库的连接对象
        cur = None
        row_count = None
        data = None
        try:
            cur = conn.cursor()  # 获取执行SQL的游标对象
            if params is None:
                row_count = cur.execute(sql, params)  # 执行SQL并获取本次查询结果集的行数
            else:
                row_count = cur.execute(sql, params)  # 执行SQL并获取本次查询结果集的行数
            data = cur.fetchall()  # 获取本次查询结果集
        except Exception as e:
            print('执行SQL语句时出现异常')
            print(e)
        finally:
            MySQLUtils.closeResource(conn=conn, cur=cur)
        # 返回查询结果集
        return {
            'row_count': row_count,
            'data': data
        }

    @staticmethod
    def updateAndSelect(sql, params=None):
        """
        更新MySQL数据库中数据的通用方法，包括对数据库中数据的增删改；并查询数据库中的数据，用于有返回的存储函数

        @param - sql: 需要执行的sql语句
        @param - params: 向sql语句中填充的参数，元组类型，默认值为None

        @return: 返回本次操作对数据库中数据的影响行数和查询的结果
        """
        conn = MySQLUtils.getConnection()  # 获取MySQL的连接对象
        cur = None
        row_count = None
        data = None
        try:
            cur = conn.cursor()  # 获取执行sql的游标对象
            if params is None:
                row_count = cur.execute(sql)
            else:
                row_count = cur.execute(sql, params)
            conn.commit()  # 提交本次操作
            data = cur.fetchall()  # 获取本次查询结果集
        except Exception as e:
            conn.rollback()  # 如果执行SQL语句时出现异常则回滚本次操作
            print('执行SQL语句时出现异常')
            print(e)
        finally:
            MySQLUtils.closeResource(conn=conn, cur=cur)  # 关闭连接数据库的资源
        # 返回查询结果集
        return {
            'row_count': row_count,
            'data': data
        }

    @staticmethod
    def closeResource(conn=None, cur=None):
        """
        关闭与操作MySQL数据库相关的资源对象

        @param - conn: MySQL数据库的连接对象
        @param - cur: 执行sql语句的游标对象

        @return: 无返回值
        """
        try:
            if cur is not None:
                cur.close()
            if conn is not None:
                conn.close()
        except Exception as e:
            print('关闭MySQL资源对象出错')
            print(e)


# def getDataSingle()


if __name__ == '__main__':
    # sql = "INSERT INTO user_account_info(user_account, user_telephone, user_password, username) VALUES (%s, %s, %s, %s);"
    # sql = """
    # INSERT INTO user_account_info(user_account, user_telephone, user_password, username, user_register_time)
    # VALUES (%s, %s, %s, %s, %s);
    # """
    # print(MySQLUtils.update(sql, ('234', '234', '234', '234', '2022-11-25 21:47:55')))
    # sql = 'select * from user_account_info'
    # print(MySQLUtils.select(sql))
    pass
